---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      name:  <unnamed>
       log:  /Users/jesse/Dropbox/voter_id/Replication/table_a9.log
  log type:  text
 opened on:  17 Aug 2020, 16:33:24

. 
. use "$path/nc_dataset.dta" if new_reg == 0, clear

. 
. // drop 2018 
. drop if inlist(election, 11, 12)
(13,254,638 observations deleted)

. 
. drop new_reg noid_p_2016 hispanic black white othernw

. 
. sort id election

. 
. replace voted = 0 if voted == .
(0 real changes made)

. 
. // replace voted with NA if under 18 / ineligible in that election year 
. drop if birth_year > 1998 & birth_year < 9999
(70 observations deleted)

. replace voted = . if (birth_year > 1990 & birth_year < 9999) & (election == 1 | election == 2) // 2008
(1,102,090 real changes made, 1,102,090 to missing)

. replace voted = . if (birth_year > 1992 & birth_year < 9999) & (election == 3 | election == 4) // 2010
(680,176 real changes made, 680,176 to missing)

. replace voted = . if (birth_year > 1994 & birth_year < 9999) & (election == 5 | election == 6) // 2012
(269,954 real changes made, 269,954 to missing)

. replace voted = . if (birth_year > 1996 & birth_year < 9999) & (election == 7 | election == 8) // 2014
(314 real changes made, 314 to missing)

. 
. ** create string encoding of possible pre-treatment outcome paths
. tostring voted, generate(outcome_path)
outcome_path generated as str1

. 
. by id: gen outcome_path_pretreat = outcome_path[1] + outcome_path[2] + ///
>                                                                 outcome_path[3] + outcome_path[4] + ///
>                                                                 outcome_path[5] + outcome_path[6] + ///
>                                                                 outcome_path[7] + outcome_path[8]

. 
. gen count = 1

. 
. // keep general only
. keep if mod(election,2) == 0
(33,136,560 observations deleted)

. 
. // generate party interactions
. gen una = dem == 0 & rep == 0

. gen treat_dem = treat * dem

. gen treat_una = treat * una

. gen no_dmv_dem = no_dmv_match * dem

. gen no_dmv_una = no_dmv_match * una

. 
. replace voted = 0 if voted == .
(1,026,267 real changes made)

. 
. // construct age bins, give young voters who are ineligible for some election their own age bin
. gen age_bin = 11 if (birth_year > 1990 & birth_year < 9999)
(30,381,335 missing values generated)

. replace age_bin = 12 if (birth_year > 1992 & birth_year < 9999)
(1,700,440 real changes made)

. replace age_bin = 13 if (birth_year > 1994 & birth_year < 9999)
(674,885 real changes made)

. replace age_bin = 14 if (birth_year > 1996 & birth_year < 9999)
(785 real changes made)

. // give those who are eligible over the whole period their own age decile
. xtile age_decile = birth_year if (birth_year <= 1990), nq(10)

. replace age_bin = age_decile if (birth_year <= 1990)
(30,334,280 real changes made)

. drop age_decile

. 
. compress
  variable count was float now byte
  variable una was float now byte
  variable treat_dem was float now byte
  variable treat_una was float now byte
  variable no_dmv_dem was float now byte
  variable no_dmv_una was float now byte
  variable age_bin was float now byte
  (695,867,760 bytes saved)

. 
. sort id election

. 
. * vanilla diff in diff
. 
. reghdfe voted treat treat_dem treat_una, a(id election) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,136,560
Absorbing 2 HDFE groups                           F(   3,6627311) =    7619.36
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6024
                                                  Adj R-squared   =     0.5030
                                                  Within R-sq.    =     0.0008
Number of clusters (id)      =  6,627,312         Root MSE        =     0.3511

                             (Std. Err. adjusted for 6,627,312 clusters in id)
------------------------------------------------------------------------------
             |               Robust
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
       treat |  -.1265247   .0019008   -66.56   0.000    -.1302503   -.1227991
   treat_dem |  -.0120969   .0021689    -5.58   0.000    -.0163478   -.0078459
   treat_una |   .0541263   .0024762    21.86   0.000     .0492731    .0589795
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          id |            0         6627312        6627312 *   | 
    election |            4               5              1     | 
---------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b1 = _b[treat]

. local se1 = _se[treat]

. local b1_2 = _b[treat_dem]

. local se1_2 = _se[treat_dem]

. local b1_3 = _b[treat_una]

. local se1_3 = _se[treat_una]

. local n1 = e(N)

. local nclust1 = e(N_clust)

. 
. * race by year
. reghdfe voted treat treat_dem treat_una, a(id race_by_year) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,136,560
Absorbing 2 HDFE groups                           F(   3,6627311) =    7634.43
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6034
                                                  Adj R-squared   =     0.5042
                                                  Within R-sq.    =     0.0008
Number of clusters (id)      =  6,627,312         Root MSE        =     0.3507

                             (Std. Err. adjusted for 6,627,312 clusters in id)
------------------------------------------------------------------------------
             |               Robust
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
       treat |   -.132193   .0019023   -69.49   0.000    -.1359214   -.1284646
   treat_dem |   -.001894   .0021785    -0.87   0.385    -.0061638    .0023759
   treat_una |    .042385   .0024841    17.06   0.000     .0375162    .0472538
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          id |            0         6627312        6627312 *   | 
race_by_year |           24              25              1     | 
---------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b2 = _b[treat]

. local se2 = _se[treat]

. local b2_2 = _b[treat_dem]

. local se2_2 = _se[treat_dem]

. local b2_3 = _b[treat_una]

. local se2_3 = _se[treat_una]

. local n2 = e(N)

. local nclust2 = e(N_clust)

. 
. * age by year 
. reghdfe voted treat treat_dem treat_una, a(id age_by_year) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,089,505
Absorbing 2 HDFE groups                           F(   3,6617900) =    5425.70
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6193
                                                  Adj R-squared   =     0.5241
                                                  Within R-sq.    =     0.0006
Number of clusters (id)      =  6,617,901         Root MSE        =     0.3436

                             (Std. Err. adjusted for 6,617,901 clusters in id)
------------------------------------------------------------------------------
             |               Robust
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
       treat |  -.0861704   .0019545   -44.09   0.000    -.0900012   -.0823395
   treat_dem |  -.0158549   .0022286    -7.11   0.000    -.0202229    -.011487
   treat_una |  -.0418692    .002525   -16.58   0.000    -.0468181   -.0369203
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          id |            0         6617901        6617901 *   | 
 age_by_year |          444             445              1     | 
---------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b3 = _b[treat]

. local se3 = _se[treat]

. local b3_2 = _b[treat_dem]

. local se3_2 = _se[treat_dem]

. local b3_3 = _b[treat_una]

. local se3_3 = _se[treat_una]

. local n3 = e(N)

. local nclust3 = e(N_clust)

. 
. * age by race by year
. reghdfe voted treat treat_dem treat_una, a(id race_by_age_by_year) cluster(id)
(dropped 20 singleton observations)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,089,485
Absorbing 2 HDFE groups                           F(   3,6617896) =    4880.49
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6204
                                                  Adj R-squared   =     0.5255
                                                  Within R-sq.    =     0.0005
Number of clusters (id)      =  6,617,897         Root MSE        =     0.3431

                             (Std. Err. adjusted for 6,617,897 clusters in id)
------------------------------------------------------------------------------
             |               Robust
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
       treat |  -.0935418   .0019644   -47.62   0.000     -.097392   -.0896917
   treat_dem |   .0033001   .0022467     1.47   0.142    -.0011034    .0077036
   treat_una |  -.0355303   .0025407   -13.98   0.000    -.0405101   -.0305505
------------------------------------------------------------------------------

Absorbed degrees of freedom:
----------------------------------------------------------------------+
        Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
--------------------+-------------------------------------------------|
                 id |            0         6617897        6617897 *   | 
race_by_age_by_year |         2179            2180              1     | 
----------------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b4 = _b[treat]

. local se4 = _se[treat]

. local b4_2 = _b[treat_dem]

. local se4_2 = _se[treat_dem]

. local b4_3 = _b[treat_una]

. local se4_3 = _se[treat_una]

. local n4 = e(N)

. local nclust4 = e(N_clust)

. 
. 
. 
. preserve

. 
. 
. collapse (sum) count (mean) voted, by(outcome_path_pretreat no_dmv_match no_dmv_dem no_dmv_una election)

. 
. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match no_dmv_dem no_dmv_una election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_dem != no_dmv_dem[_n-1]) | ///
>         (no_dmv_una != no_dmv_una[_n-1])) 
(4,789 missing values generated)

. // get treated units in outcome path
. egen tot_treat = sum(tot_tmp), by(outcome_path)

. // get control units in each outcome path
. by outcome_path no_dmv_match no_dmv_dem no_dmv_una: replace tot_tmp = count[1] if _n == 1
(341 real changes made)

. // get total units in each outcome path
. egen tot = sum(tot_tmp), by(outcome_path)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  5560

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path)

. 
. 
. reghdfe voted no_dmv_match no_dmv_dem no_dmv_una [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 1025 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    437,210
Absorbing 2 HDFE groups                           F(   3, 436965) =     384.80
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6424
                                                  Adj R-squared   =     0.6422
                                                  Within R-sq.    =     0.0026
                                                  Root MSE        =     0.2662

------------------------------------------------------------------------------
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
no_dmv_match |  -.0310109   .0011389   -27.23   0.000    -.0332431   -.0287788
  no_dmv_dem |  -.0021009   .0011389    -1.84   0.065     -.004333    .0001313
  no_dmv_una |   .0006288   .0011393     0.55   0.581    -.0016042    .0028618
-------------+----------------------------------------------------------------
    Absorbed |    F(241, 436965) =   3252.458   0.000             (Joint test)
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          op |          238             238              0     | 
    election |            4               5              1     | 
---------------------------------------------------------------+

. local b5 = _b[no_dmv_match]

. local se5 = _se[no_dmv_match]

. local b5_2 = _b[no_dmv_dem]

. local se5_2 = _se[no_dmv_dem]

. local b5_3 = _b[no_dmv_una]

. local se5_3 = _se[no_dmv_una]

. local n5 = N 

. local nclust5 = N_voters

. 
. 
. * match on pre-treatment turnout path and race
. 
. restore

. preserve

. 
. collapse (sum) count (mean) voted, by(outcome_path_pretreat no_dmv_match no_dmv_dem no_dmv_una race_string election)

. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match race_string no_dmv_dem no_dmv_una election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_dem != no_dmv_dem[_n-1]) | ///
>         (no_dmv_una != no_dmv_una[_n-1])) 
(16,459 missing values generated)

. // get treated units in outcome path and race
. egen tot_treat = sum(tot_tmp), by(outcome_path race_string)

. // get control units in each outcome path by race
. by outcome_path no_dmv_match race_string no_dmv_dem no_dmv_una: replace tot_tmp = count[1] if _n == 1
(1,695 real changes made)

. // get total units in each outcome path
. egen tot = sum(tot_tmp), by(outcome_path race_string)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  18455

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path race_string)

. 
. reghdfe voted no_dmv_match no_dmv_dem no_dmv_una [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 7935 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    434,760
Absorbing 2 HDFE groups                           F(   3, 434190) =     362.59
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6445
                                                  Adj R-squared   =     0.6441
                                                  Within R-sq.    =     0.0025
                                                  Root MSE        =     0.2657

------------------------------------------------------------------------------
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
no_dmv_match |  -.0308482   .0011412   -27.03   0.000    -.0330849   -.0286115
  no_dmv_dem |  -.0008405   .0011413    -0.74   0.461    -.0030774    .0013964
  no_dmv_una |   .0015986   .0011422     1.40   0.162    -.0006401    .0038372
-------------+----------------------------------------------------------------
    Absorbed |    F(566, 434190) =   1388.982   0.000             (Joint test)
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          op |          563             563              0     | 
    election |            4               5              1     | 
---------------------------------------------------------------+

. local b6 = _b[no_dmv_match]

. local se6 = _se[no_dmv_match]

. local b6_2 = _b[no_dmv_dem]

. local se6_2 = _se[no_dmv_dem]

. local b6_3 = _b[no_dmv_una]

. local se6_3 = _se[no_dmv_una]

. local n6 = N

. local nclust6 = N_voters

. 
. 
. restore

. 
. collapse (sum) count (mean) voted, by(outcome_path_pretreat no_dmv_match no_dmv_dem no_dmv_una race_string age_bin election)

. 
. drop if age_bin == . 
(2,445 observations deleted)

. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match race_string age_bin no_dmv_dem no_dmv_una election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_dem != no_dmv_dem[_n-1]) | ///
>         (no_dmv_una != no_dmv_una[_n-1]) | ///
>         (age_bin != age_bin[_n-1]))
(81,233 missing values generated)

. // get treated units in outcome path and race and age bin
. egen tot_treat = sum(tot_tmp), by(outcome_path race_string age_bin)

. // get control units in each outcome path by race and age_bin
. by outcome_path no_dmv_match race_string age_bin no_dmv_dem no_dmv_una: replace tot_tmp = count[1] if _n == 1
(10,001 real changes made)

. // get total units in each outcome path race and age bin
. egen tot = sum(tot_tmp), by(outcome_path race_string age_bin)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  89040

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path race_string age_bin)

. 
. reghdfe voted no_dmv_match no_dmv_dem no_dmv_una [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 57640 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    412,985
Absorbing 2 HDFE groups                           F(   3, 411218) =     253.46
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6367
                                                  Adj R-squared   =     0.6352
                                                  Within R-sq.    =     0.0018
                                                  Root MSE        =     0.2676

------------------------------------------------------------------------------
       voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
no_dmv_match |   -.027923   .0011869   -23.53   0.000    -.0302493   -.0255967
  no_dmv_dem |   .0017175   .0011875     1.45   0.148    -.0006098    .0040449
  no_dmv_una |   .0031092   .0011912     2.61   0.009     .0007745     .005444
-------------+----------------------------------------------------------------
    Absorbed |   F(1763, 411218) =    408.040   0.000             (Joint test)
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
-------------+-------------------------------------------------|
          op |         1760            1760              0     | 
    election |            4               5              1     | 
---------------------------------------------------------------+

. local b7 = _b[no_dmv_match]

. local se7 = _se[no_dmv_match]

. local b7_2 = _b[no_dmv_dem]

. local se7_2 = _se[no_dmv_dem]

. local b7_3 = _b[no_dmv_una]

. local se7_3 = _se[no_dmv_una]

. local n7 = N

. local nclust7 = N_voters

. 
. log close
      name:  <unnamed>
       log:  /Users/jesse/Dropbox/voter_id/Replication/table_a9.log
  log type:  text
 closed on:  17 Aug 2020, 17:06:54
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
